#include"NetCal.hpp"//业务处理
#include"Protocol.hpp"//协议处理
#include "TcpServer.hpp"//链接获取和关闭
#include <memory>
#include"Daemon.hpp"
void Usage(std::string proc)
{
    std::cerr<<"Usage: "<<proc<<std::endl;
}

int main(int argc, char *argv[])
{
    if(argc!=2)
    {
        Usage(argv[0]);
        exit(USAGE_ERROR);
    }

    std::cout<<"服务器已经启动，已经是一个守护进程了"<<std::endl;
    //守护进程化
    //Daemon(0,0);//Daemon() 让程序 “后台化”，脱离终端也能跑；
    daemon(0,0);

    //上面进行了守护进程化，那么我们这里就只剩下一个子进程了
    //让程序 “后台跑的同时，还能把日志 / 信息回显到终端”，方便你调试、监控程序～
    //Enable_Console_Log_Strategy(); // 开启控制台日志策略---输出的时候往显示器上进行打印操作
    Enable_File_Log_Strategy();//采用文件方式显示日志

    //1、顶层
    std::unique_ptr<Cal>cal=std::make_unique<Cal>();//创建一个业务对象


    
    //2、协议  序列和反序列化
    std::unique_ptr<Protocol> protocol = std::make_unique<Protocol>([&cal](Request&req)->Response{
        return cal->Excute(req); // 调用业务对象的处理方法
    }); // 创建协议对象
    //返回的参数是Response，服务的对象是cal,参数类型是Request&req


    //3、服务器层
    std::unique_ptr<TcpServer> tsvr = std::make_unique<TcpServer>(std::stoi(argv[1]),//创建一个服务器对象
    [&protocol](std::shared_ptr<Socket> &sock, InetAddr &client){//将我们协议所对应的方法注册到TcpServer方法内
        protocol->GetRequest(sock, client); // 获取请求报文
    });// 创建TCP服务器,argv[1]是端口号
    tsvr->Start(); // 启动服务器
    // // 基类指针指向子类
    // std::unique_ptr<Socket> sockp = std::make_unique<TcpSocket>();
    // sockp->BuildTcpSocketMethod(); // 直接就创建好了TCP套接字了
    return 0;
}